//! Redis服务功能模块
//! 
//! 抽取原有Redis功能为独立函数，支持在Standalone和Cluster模式中复用
//! 支持不同运行模式，在standalone模式下禁用CLUSTER命令

use crate::network::start_simple_tokio_redis_server;
use crate::storage::{GlobalStorageManager, RedisServerMode};
use std::io;
use tokio::task::JoinHandle;
use tracing::{info, error};

/// Redis服务句柄
pub struct RedisService {
    pub handle: JoinHandle<()>,
    pub bind_addr: String,
}

/// 启动Redis服务功能
/// 
/// 这是从原有代码抽取出的Redis服务启动函数
/// 可以在Standalone和Cluster模式中复用
pub async fn start_redis_service(bind_addr: &str) -> io::Result<RedisService> {
    start_redis_service_with_mode(bind_addr, RedisServerMode::Standalone).await
}

/// 使用指定模式启动Redis服务功能
pub async fn start_redis_service_with_mode(bind_addr: &str, mode: RedisServerMode) -> io::Result<RedisService> {
    info!("🚀 启动Redis服务功能（模式: {:?}）", mode);
    info!("📍 Redis监听地址: {}", bind_addr);
    
    // 使用指定模式初始化全局存储
    GlobalStorageManager::initialize_with_mode(mode);
    
    let addr = bind_addr.to_string();
    let handle = tokio::spawn(async move {
        if let Err(e) = start_simple_tokio_redis_server(&addr).await {
            error!("❌ Redis服务启动失败: {}", e);
        }
    });
    
    // 给一点时间让服务启动
    tokio::time::sleep(std::time::Duration::from_millis(100)).await;
    
    info!("✅ Redis服务功能启动成功");
    
    Ok(RedisService {
        handle,
        bind_addr: bind_addr.to_string(),
    })
}

/// 停止Redis服务
pub async fn stop_redis_service(service: RedisService) -> io::Result<()> {
    info!("🛑 停止Redis服务: {}", service.bind_addr);
    service.handle.abort();
    info!("✅ Redis服务已停止");
    Ok(())
}